/*****************************************************************************************************************************
 * \file   : Queue.c
 * \module : Queue 
 * \brief  : Queue process source file  
 * \project: 
 * \author : SHB
 *============================================================================================================================
 *                                                   Revision control History
 *============================================================================================================================
 * V1.0.0: 2021-06-29: Initial Version
 *
 *
 *
 ****************************************************************************************************************************/

/*****************************************************************************************************************************
 * Other header files
 ****************************************************************************************************************************/
#include "Queue.h"

/*****************************************************************************************************************************
 * Macro decalaration
 ****************************************************************************************************************************/


/*****************************************************************************************************************************
 * Enum decalaration
 ****************************************************************************************************************************/

/*****************************************************************************************************************************
 * typedef compound type decalaration
 ****************************************************************************************************************************/


/*****************************************************************************************************************************
 * Struct decalaration
 ****************************************************************************************************************************/

/*****************************************************************************************************************************
 * Local variables decalaration
 ****************************************************************************************************************************/

/*****************************************************************************************************************************
 * Global variables definition
 ****************************************************************************************************************************/


/*****************************************************************************************************************************
 * Static Local Function decalaration property
 ****************************************************************************************************************************/

/*****************************************************************************************************************************
 * Function definition
 ****************************************************************************************************************************/
/*****************************************************************************************************************************
 ** Function Name         : Queue_Ctor
 **
 ** Service ID            : 0x01
 **
 ** Description           : This function is Constructor
 **
 ****************************************************************************************************************************/
void Queue_Ctor(Queue *me, uint8_t QueSize)
{
    me->Qhead = 0u;
    me->Qtail = 0u;
    me->Qsize = QueSize;
    me->Qused = 0u;
}
/*****************************************************************************************************************************
 ** Function Name         : Queue_Pop
 **
 ** Service ID            : 0x02
 **
 ** Description           : This function Pop data from the queue
 **
 ****************************************************************************************************************************/
Queue_DataType Queue_Pop(Queue *me)
{
    Queue_DataType Ledata = me->Qbuf[me->Qtail];

    me->Qtail = (me->Qtail + 1u) % (me->Qsize);
    me->Qused -= 1u;
    
    return Ledata;
}
/*****************************************************************************************************************************
 ** Function Name         : Queue_Push
 **
 ** Service ID            : 0x03
 **
 ** Description           : This function Push data in the queue
 **
 ****************************************************************************************************************************/
void Queue_Push(Queue *me, Queue_DataType Qdata)
{
    me->Qbuf[me->Qhead] = Qdata;
    me->Qhead = (me->Qhead + 1u) % (me->Qsize);
    me->Qused += 1u;
}
/*****************************************************************************************************************************
 ** Function Name         : Queue_IsFull
 **
 ** Service ID            : 0x04
 **
 ** Description           : This function checks whether the queue is full 
 **
 ****************************************************************************************************************************/
uint8_t Queue_IsFull(Queue *me)
{
    uint8_t LeisFull = 0;
    if ( me->Qused == me->Qsize ) {
        LeisFull = 1;
    }
    return LeisFull;
}
/*****************************************************************************************************************************
 ** Function Name         : Queue_IsEmpty
 **
 ** Service ID            : 0x05
 **
 ** Description           : This function checks whether the queue is empty
 **
 ****************************************************************************************************************************/
uint8_t Queue_IsEmpty(Queue *me)
{
    uint8_t LeisEmpty = 0;
    if ( me->Qused == 0U ) {
        LeisEmpty = 1;
    }
    return LeisEmpty;
}
/*****************************************************************************************************************************
 ** Function Name         : Queue_Clear
 **
 ** Service ID            : 0x06
 **
 ** Description           : This function clear queue
 **
 ****************************************************************************************************************************/
void Queue_Clear(Queue *me)
{
    me->Qhead = 0u;
    me->Qtail = 0u;
    me->Qused = 0u;
}
/*****************************************************************************************************************************
 * End of file
 ****************************************************************************************************************************/

